package fiuba.algo3.gpschallenge.modelo;

import java.awt.Toolkit;

import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;

import fiuba.algo3.gpschallenge.modelo.exception.LimiteMapaException;
import fiuba.algo3.gpschallenge.modelo.vehiculos.Automovil;
import fiuba.algo3.gpschallenge.modelo.vehiculos.Vehiculo;
import fiuba.algo3.gpschallenge.persistencia.SerializableAXml;


@XmlRootElement
public class Jugador implements SerializableAXml {
	
	private int movimientos;
	private String nombre;
	
	private Vehiculo vehiculo;
	private Posicion posicionAnterior;
	private Posicion posicionActual;
	private final byte COSTO_MOVIMIENTO = 1;
	
	public Jugador(){
		this.movimientos = 0;
		this.vehiculo = new Automovil();
		this.posicionAnterior = null;
		this.posicionActual = new Posicion();
	}
	
	public Jugador (Vehiculo vehiculoInicial){
		this.movimientos = 0;
		this.vehiculo = vehiculoInicial;
		this.posicionActual = new Posicion();
		this.posicionAnterior = null;
	}
	
	public void setVehiculo (Vehiculo vehiculo){
		this.vehiculo = vehiculo;
	}
	
	public int getMovimientos(){
		return this.movimientos;
	}
	
	@XmlElementRef
	public Vehiculo getVehiculo(){
		return vehiculo;
	}
	
	public void setMovimientos(int movimientosActuales) {
		this.movimientos = movimientosActuales;	
	}
	
	public void aumentarMovimientos(int aumentoDeseado){
		this.movimientos += aumentoDeseado;
	}
	
	public void cambiarVehiculo(Vehiculo nuevoVehiculo){
		vehiculo = nuevoVehiculo;
	}

	public void posicionar(int pPosHorizontal, int pPosVertical) {
		
		this.setPosicionActual(new Posicion(pPosHorizontal,pPosVertical));
		//al posicionar por primera vez, las dos posiciones son iguales.
		this.setPosicionAnterior(new Posicion());
		this.getPosicionAnterior().setPosicionHorizontal(this.getPosicionActual().getPosicionHorizontal());
		this.getPosicionAnterior().setPosicionVertical(this.getPosicionActual().getPosicionVertical());
	}

	public Posicion getPosicionActual() {
		return posicionActual;
	}

	public void setPosicionActual(Posicion posicionActual) {
		this.posicionActual = posicionActual;
	}
	
	public void setPosicionAnterior(Posicion posicionAnterior) {
		this.posicionAnterior = posicionAnterior;
	}
	
	public Posicion getPosicionAnterior() {
		
		return posicionAnterior;
	}

	public boolean moverseArriba(Mapa mapa) {
		try {
			this.posicionAnterior = new Posicion(this.posicionActual.getPosicionHorizontal(),this.posicionActual.getPosicionVertical());
			this.posicionActual.SumarPosicionHorizontal(2);
			if (mapa.getEfectoArriba(this.posicionAnterior) != null)
				this.getVehiculo().aplicarEfecto (mapa.getEfectoArriba(this.posicionAnterior), this);
			this.movimientos += COSTO_MOVIMIENTO;
			return true;
		} catch (LimiteMapaException e) {
			Toolkit.getDefaultToolkit().beep(); 
			return false;
		}
	}
	
	public boolean moverseDerecha(Mapa mapa) {
		try {
			this.posicionAnterior = new Posicion(this.posicionActual.getPosicionHorizontal(),this.posicionActual.getPosicionVertical());
			this.posicionActual.SumarPosicionVertical(2);
			if (mapa.getEfectoDerecha(this.posicionAnterior) != null)
				this.getVehiculo().aplicarEfecto (mapa.getEfectoDerecha(this.posicionAnterior), this);
			this.movimientos += COSTO_MOVIMIENTO;
			return true;
		} catch (LimiteMapaException e) {
			Toolkit.getDefaultToolkit().beep(); 
			return false;
		}
	}
	
	public boolean moverseAbajo(Mapa mapa) {
		try {
			this.posicionAnterior = new Posicion(this.posicionActual.getPosicionHorizontal(),this.posicionActual.getPosicionVertical());
			this.posicionActual.SumarPosicionHorizontal(-2);
			if (mapa.getEfectoAbajo(this.posicionAnterior) != null)
				this.getVehiculo().aplicarEfecto (mapa.getEfectoAbajo(this.posicionAnterior), this);
			this.movimientos += COSTO_MOVIMIENTO;
			return true;
		} catch (LimiteMapaException e) {
			Toolkit.getDefaultToolkit().beep(); 
			return false;
		}
	}
	
	public boolean moverseIzquierda(Mapa mapa) {
		try {
			this.posicionAnterior = new Posicion(this.posicionActual.getPosicionHorizontal(),this.posicionActual.getPosicionVertical());
			this.posicionActual.SumarPosicionVertical(-2);
			if (mapa.getEfectoIzquierda(this.posicionAnterior) != null)
				this.getVehiculo().aplicarEfecto (mapa.getEfectoIzquierda(this.posicionAnterior), this);
			this.movimientos += COSTO_MOVIMIENTO;
			return true;
		} catch (LimiteMapaException e) {
			Toolkit.getDefaultToolkit().beep(); 
			return false;
		}
	}
	
	public void setNombre(String nombre){
		this.nombre=nombre;
	}

	public String getNombre() {
		return this.nombre;
	}
}
